import inspect

import requests

from configs.config import HOST
from utils.handle_path import HuaYanPath
from utils.handle_yaml import get_yaml_data


class BaseAPI:
    def __init__(self,cookies=None):
        """
        1获取一些配置信息 path 请求方式 请求体
        2 如果是业务的接口传递cookies进来，如果是登录 None
        设置属性 self.cookies = cookies
        设置个属性  获取cookies里面的 X-Space-Id

        """
        if cookies:
            self.cookies = cookies
            self.space_id = self.cookies['X-Space-Id']
        else:
            self.cookies = None
        # 根据类名称读取yaml数据，如lib/login的LoginAPI类，就会读到对应的yaml数据
        self.data = get_yaml_data(HuaYanPath.configs_path / 'apiConfig.yaml')[self.__class__.__name__]

    def request_send(self,method,_id="",json=None,params=None):
        """
        method 请求方式
        url HOST+PATH+id（不是所有接口都是id ） 有就传没有默认为空
        json: post put需要
        params get请求传递三叔
        cookies: 1怎么来？ 登录获取
                2怎么传递 放在init 里面
        return 如果是登录接口 返回可能响应体 也可能返回json 本身测登录
        其他业务接口 返回json的数据

        """

        res = requests.request(method,url=HOST+self.data['path']+_id,json=json,params=params,cookies=self.cookies)
        return res
    #增
    def add(self,**kwargs):  #k=v
        """
        1业务的添加的参数不一样的，使用不定关键字参数
        2做什么事情
            2.1 替换模板读取到的数据
            2.2 替换space id
            2.3 对应的请求方法  POST
        3.添加部门的时候需要总公司这个值 别的接口不一定需要
            3.1 通过业务继承基类以后 重写add方法 把总公司部门加进去
        :return: 进行过滤 resp['value'][0]
        """
        payload = self.data['add']
        payload.update(kwargs) # 装包
        return self.request_send(method='post',json=payload).json()
    #删除
    def delete(self,_id):
        """
        业务删除接口
        :param _id: 业务具体id
        请求方式DELETE
        :return:
        """
        return self.request_send(method='delete',_id=_id)

    #修改
    def update(self,_id,**kwargs):
        """
        1参数id具体某个业务  不定的关键字参数
        2替换 模板数据和spaceid
        3请求方式PUT

        :return:
        """
        payload = self.data['update']
        payload['$set'].update(kwargs)
        return self.request_send(method='put',_id=_id,json=payload).json()
    #查询
    def query(self,**kwargs):
        """
        url参数  公共方法传入的params
        :return: 过滤信息  resp['value']
        """
        # payload = self.data['query']
        # payload.update(kwargs)
        return self.request_send(method='get',params=kwargs).json()['value']

    def delete_all_items(self):
        """
        1删除所有业务数据
            调用查询所有数据
            循环调用删除方法
        2总不免不能删
            2.1 具体部门里进行方法重写
        :return:
        """
        # **kwargs指删除所有业务前的查询条件
        # print(self.request_send(method='get',params=kwargs).json()['value'][0]['children'])
        # all_id = self.request_send(method='get',params=kwargs).json()['value'][0]['children']
        all_id = self.query()[0]['children'] # 直接用query不传参即可查询所有
        res = ''
        for id in all_id: # 循环删除
            res = self.request_send(method='delete',_id=id).json()
        return res
